[t:/]$ 지식_

uart 짬빱

2020/01/03

항상 그렇듯이 쓰기 싫은데 새해 맞이 잘ㄴ난척겸 억지로 한 번 정리하고 넘어감. 틀린 내용 있을 수 있음.

숙련 임베디드 엔지니어는 uart, 그러니까 rs232c 통신의 스코프 파형을 바로 헥사로 읽을 수 있다. 그게 어렵지도 않은 것이 우리는 2진수를 헥사로 바로 바꿀 수 있다.

16진수 - 2진수 바꾸기

1100b를 예를 들어 보자. 앞자리부터 8, 4, 2, 1를 부여해서 1이 있으면 더하면 된다. 이 경우 8 + 4 = 12이고 12는 헥사로 c다.

스코프에서 바로 읽기

펄스가 통통찍찍통통찍찍이다. 11001100b다. 그러므로 0xcc가 된다.

스코프 보고 바로 속도 알기

rs232c에서 1바이트는 10비트이다. 스타트 1비트 스톱 1비트가 포함되어서 그렇다. 패리티가 없을 경우 그런데 485 아니면, 또는 인터커넥트 (PCB 내부 칩간 통신) 경우 패리티를 쓰는 일은 거의 없다. 9600bps는 1초에 약 10000비트다. 즉 1비트가 1ms가 된다. 스코프 타임 스케일을 대충 보면 아 펄스 1개에 1ms구나 알 수 있고 가장 많이 쓰는 9600bps는 스코프만 보고 속도를 알 수 있다.

이제 스코프만 보고 시리얼 통신을 읽을 수 있다.

대략 전문가 처럼 보일 수 있음.

스타트 비트와 스톱 비트 왜 로우인가

선배님들한테 맞아가며 배운 지식에 따르면 전자회로에서 중요한 트리거 신호는 로우로 때리는 것이 안전하다는 것이다. 신호를 로우로 잡고 있다가 하이를 때려 트리거를 잡으면 노이즈에 취약할 가능성이 있다. 반면에 하이로 빡때리고 있을 때 임의의 디지털 노이즈로 드레인을 뽑아 로우로 떨어질 가능성은 적다고 한다. 물론 나는 전자 엔지니어가 아니므로 여기까지만 적는다. 마찬가지로 POR 리셋 시그널 등도 로우 이네이블을 잡는다.

rs232c 시리얼 통신은 시간에만 관계한다.

9600bps 통신이라고 하면 약 1ms마다 신호를 관측하여 하이로우를 판별한다. 예컨데 신호를 전부 하이로 띄워놓고 대략 10ms 마다 0을 한 번씩 뽑으면 0xF가 된다. 굳이 펄스로 통통 튀길 필요는 없다는 뜻이다. 엣지가 필요없다. 어쨌든 서로 속도를 알고 있어야 정상적인 통신이 된다. 초반 쓰레기를 속도 바꿔가며 읽어가며 속도 판별하는 로직은 만들 수 있다. 많이들 그렇게 썼는데 요즘은 칩이 알아서 해주지 않을까도 싶음.

상태에 관계된 통신도 있다.

spi, i2c 등은 기준 클럭의 상태와 관계있다. 동기화 클럭이 활성일 때 데이터 클럭을 살펴보면 된다. 송수신측이 서로 속도를 맞추지 않아도 된다.

그렇다면 CPU-GPIO로 시리얼 통신을 만들 수도 있다.

CPU가 GPIO를 직접 올리고 내리고 하면 칩에서 페리(부가장치)가 부족할 때 직접 만들어 쓸 수 있다. 물론 현대적인 시스템에서 이럴 일은은 없지만 가끔 있을 지도 모른다. rs232c라면 cpu를 코딩하여 루프 돌면서 짜면 오류 가능성이 있다. 9600bps에서 약 1ms를 맞춰가며 펄스 셋팅을 해야 하기 때문이다. 루프에서 매번 시스템 클럭을 통해 시간 주기를 확인하거나, 타이머 인터럽트를 사용해야 한다.

한 편으로 i2c등은 속도를 무지막지하게 올릴 수도 있다.

양측에서 받아만 준다면 상태만 보기 때문에 얼마든지 속도를 올려도 된다. 최대 속도는 양쪽 CPU가 GPIO를 토글링 할 수 있는 최대 속도가 된다. 즉 직접 구현한 i2c 류 통신은 속도를 쫘악 올릴 수 있다. 칩이 자체지원하는 i2c 페리의 최대 속도는 구석기로 만들 수 있다.

잘 안 되는데?

실제로 해보면 GPIO가 CPU의 토글링을 못 쫓아가거나 입력 트리거가 못 쫓아간다. 가끔 희소 입력 인터럽트를 지원하는 칩이 있긴 한데 뭐 역시 정상적인 방법은 아니고 그걸로 뭘 만들어 볼 생각은 안 해봤다. 게다가 속도가 마구 올렸을때 스코프를 찍어보면 펄스 처짐 현상을 볼 수 있는데 아마도 드라이빙 전류 부족으로 추정만 하고 있다. 욕심 내지 말자.

마찬가지로 pwm도 직접 만들 수 있다.

pwm은 주파수와 듀티비가 전부다. GPIO를 토글링 하면 된다. 그런데 너무 빨리 토글링 하면 어찌되나? 수신측이 못 알아먹는다. TR 등을 달아서 대전류를 컨트롤 한다면 TR이 타 버릴 수도 있다. 너무 늦게 토글링 하면 어찌되나? AC로 인정하는(?) 전압이 그냥 펄스의 높낮이처럼 될 것이다. LED 조도를 생각해보자. 너무 느리게 토글링 하면 조도가 생성되지 않고 깜빡거리기 시작한다. 서보를 생각해보자. 서보가 소음을 내며 덜덜 거릴 것이다.

인터커넥트에서는 승압이 필요없다.

짧은 거리, 칩간 통신이라면 max232나 sipex 칩의 승압과정이 필요없다. 단, 양측다 전압 인정범위를 알아먹어야 됨. 한 쪽에서 12볼트 때리고 한 쪽에서 3.3볼트로 받아먹으면 칩이 망가지겠죠? 한 편으로 선이 좀 길어지거나 공장 처럼 노이지한 장소라면 승압을 하는 것이 안전하다. 485가 괜히 차동신호를 쓰는게 아니다. RS232C는 사실 전압 규격을 포함한 것이다. TTL이나 3.3v 통신이라면 그냥 usart라고 말하는 것 같다. 칩 매뉴얼을 잘 읽으면 전압 관용이 있는 GPIO도 있었던 것 같다. 3.3이나 기타 저전압 포트인데 5V 레벨을 지원한다던가... 그랬던 것 같은데 기억이 정확하지는 ㅇ낳다.

귀찮다고 에디터만 보고 있지 말자..

귀찮다고 디버거 설정 안 한다. 디버거 꾸역꾸역 붙였는데 스코프 가져오기 싫다. 스코프로 뭐 보기도 힘든데 로직어날 가져오기 귀찮다... 그러다 인생이 흘러가는 거다. 귀찮아도 로직어날 가져오자. 프로토콜 다 풀어주는데 뭔 통통찍찍이야..

10분 지났으니 황급히 글을 마침. 끗.





공유하기













[t:/] is not "technology - root". dawnsea, rss